import os
import json
import logging
import pymysql

# 配置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

# MySQL 数据库配置
DB_CONFIG = {
    'host': 'localhost',      # MySQL 服务器地址
    'user': 'root',          # 用户名
    'password': 'Aqilmini886',# 密码
    'database': 'mini_program',     # 数据库名称
    'charset': 'utf8mb4'      # 字符编码
}

class Database:
    def __init__(self, **config):
        self.config = config
        self.connection = None

    def connect(self):
        """连接到 MySQL 数据库"""
        try:
            self.connection = pymysql.connect(**self.config)
            logging.info("成功连接到 MySQL 数据库")
        except pymysql.Error as e:
            logging.error(f"连接 MySQL 数据库失败: {e}")
            raise

    def close(self):
        """关闭数据库连接"""
        if self.connection:
            self.connection.close()
            logging.info("数据库连接已关闭")

    def create_table(self):
        """创建数据表（如果不存在）"""
        create_table_sql = """
        CREATE TABLE IF NOT EXISTS exam_questions (
            id INT NOT NULL,           -- 题目 ID
            subject INT NOT NULL,      -- 科目（1: 科目一, 4: 科目四）
            model VARCHAR(10) NOT NULL,-- 驾照类型（如 A1, C1）
            question TEXT NOT NULL,    -- 题目内容
            answer VARCHAR(10) NOT NULL,-- 正确答案
            item1 TEXT,                -- 选项1
            item2 TEXT,                -- 选项2
            item3 TEXT,                -- 选项3
            item4 TEXT,                -- 选项4
            explains TEXT,             -- 题目解析
            url TEXT,                  -- 图片 URL
            PRIMARY KEY (subject, model, id)  -- 复合主键
        );
        """
        try:
            with self.connection.cursor() as cursor:
                cursor.execute(create_table_sql)
            self.connection.commit()
            logging.info("数据表创建成功")
        except pymysql.Error as e:
            logging.error(f"创建数据表失败: {e}")
            raise

    def insert_data(self, data):
        """将数据插入到数据库表中"""
        insert_sql = """
        INSERT IGNORE INTO exam_questions (id, subject, model, question, answer, item1, item2, item3, item4, explains, url)
        VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
        """
        try:
            with self.connection.cursor() as cursor:
                cursor.executemany(insert_sql, data)
            self.connection.commit()
            logging.info(f"成功插入 {len(data)} 条数据")
        except pymysql.Error as e:
            logging.error(f"插入数据失败: {e}")
            raise

def load_json_files(folder_path):
    """
    加载文件夹中的所有 JSON 文件，并返回合并后的数据。
    """
    data = []
    if not os.path.exists(folder_path):
        logging.error(f"文件夹不存在: {folder_path}")
        return data

    for filename in os.listdir(folder_path):
        if filename.endswith('.json'):
            file_path = os.path.join(folder_path, filename)
            try:
                with open(file_path, 'r', encoding='utf-8') as file:
                    file_data = json.load(file)
                    logging.info(f"成功加载文件: {filename}")

                    if isinstance(file_data, dict) and 'result' in file_data:
                        # 如果 JSON 数据是字典且包含 'result' 字段
                        data.extend(file_data['result'])
                    elif isinstance(file_data, list):
                        # 如果 JSON 数据是列表
                        data.extend(file_data)
                    else:
                        logging.warning(f"文件 {filename} 的 JSON 数据格式不支持，跳过")
            except json.JSONDecodeError as e:
                logging.error(f"文件 {filename} 解析失败: {e}")
            except Exception as e:
                logging.error(f"加载文件 {filename} 时发生错误: {e}")
    return data

def main():
    # 1. 定义科目一和科目四的文件夹路径
    subject_folders = {
        1: '/Users/salam/Development/uniapp/fastapi/驾照题库/科目1',  # 科目一的文件夹
        4: '/Users/salam/Development/uniapp/fastapi/驾照题库/科目四'   # 科目四的文件夹
    }

    # 2. 初始化数据库连接

    db = Database(**DB_CONFIG)

    try:
        # 3. 连接数据库
        db.connect()

        # 4. 创建表
        db.create_table()

        # 5. 遍历科目文件夹
        for subject, folder_path in subject_folders.items():
            if not os.path.exists(folder_path):
                logging.error(f"文件夹不存在: {folder_path}")
                continue

            # 6. 遍历文件夹中的 JSON 文件
            for filename in os.listdir(folder_path):
                if filename.endswith('.json'):
                    model = os.path.splitext(filename)[0]  # 从文件名中提取驾照类型（如 a1, c1）
                    file_path = os.path.join(folder_path, filename)

                    try:
                        with open(file_path, 'r', encoding='utf-8') as file:
                            file_data = json.load(file)
                            logging.info(f"成功加载文件: {filename}")

                            if isinstance(file_data, dict) and 'result' in file_data:
                                # 如果 JSON 数据是字典且包含 'result' 字段
                                data_to_insert = []
                                for item in file_data['result']:
                                    data_to_insert.append((
                                        item.get('id'),
                                        subject,  # 添加 subject 字段
                                        model,    # 添加 model 字段
                                        item.get('question', ''),
                                        item.get('answer', ''),
                                        item.get('item1', ''),
                                        item.get('item2', ''),
                                        item.get('item3', ''),
                                        item.get('item4', ''),
                                        item.get('explains', ''),
                                        item.get('url', '')  # 图片 URL
                                    ))

                                # 插入数据到数据库
                                db.insert_data(data_to_insert)
                            elif isinstance(file_data, list):
                                # 如果 JSON 数据是列表
                                data_to_insert = []
                                for item in file_data:
                                    data_to_insert.append((
                                        item.get('id'),
                                        subject,  # 添加 subject 字段
                                        model,    # 添加 model 字段
                                        item.get('question', ''),
                                        item.get('answer', ''),
                                        item.get('item1', ''),
                                        item.get('item2', ''),
                                        item.get('item3', ''),
                                        item.get('item4', ''),
                                        item.get('explains', ''),
                                        item.get('url', '')  # 图片 URL
                                    ))

                                # 插入数据到数据库
                                db.insert_data(data_to_insert)
                            else:
                                logging.warning(f"文件 {filename} 的 JSON 数据格式不支持，跳过")
                    except json.JSONDecodeError as e:
                        logging.error(f"文件 {filename} 解析失败: {e}")
                    except Exception as e:
                        logging.error(f"加载文件 {filename} 时发生错误: {e}")

    except Exception as e:
        logging.error(f"程序运行失败: {e}")
    finally:
        # 7. 关闭数据库连接
        db.close()

    logging.info("程序运行结束")

if __name__ == '__main__':
    main()
